
package Proyecto;

import java.util.ArrayList;

public class CostoUniforme {
    int nElementos=0;
    MonticuloBinario arreglo=new MonticuloBinario();
    String matriz[][];
    int nodosCreados,nodosExpandidos;
    long tiempoInicio,duracion;

    public CostoUniforme(String[][] matriz) {
        this.matriz = matriz;
        Nodo raiz=new Nodo(matriz,0,null,null,0);        
//        raiz.DeterminarPosiciones();
//        raiz.ImprimirPosiciones();
        nElementos++;
        nodosCreados++;
        nodosExpandidos++;
        arreglo.Ingresar(new Object[]{raiz.costoActual,raiz});
        tiempoInicio=System.currentTimeMillis();
    }

    public int RetornarNodosCreados()
    {
      return nodosCreados;
    }

    public int RetornarNodosExpandidos()
    {
      return nodosExpandidos;
    }

    public Nodo BusquedaCostoUniforme()
    {
        nodosCreados=0;
        nodosExpandidos=0;
        Nodo actual=(Nodo)arreglo.ExtraerMin()[1];
        if(actual.Viabilidad())
        {
            while(!actual.EsMeta())
            {   
               // ArrayList hijos=actual.expandir();
                ArrayList hijos=actual.expandirOrdenExpansion();
                nodosExpandidos++;
                nodosCreados+=hijos.size();
                for (int i = 0; i < hijos.size(); i++) {
                    Nodo hijo=(Nodo) hijos.get(i);
                    arreglo.Ingresar(new Object[]{hijo.costoActual,hijo});
                }
                actual=(Nodo)arreglo.ExtraerMin()[1];
    //            System.out.println();
    //            actual.ImprimirEstado();
    //            System.out.println();
    //            actual.ImprimirPosiciones();
    //            System.out.println();
            }
            duracion=System.currentTimeMillis()-tiempoInicio;
            System.out.println("Duracion :"+duracion);
            System.out.println("Meta hallada =D");
            return actual;
        }else return null;
    }
    
    
}
